home *** CD-ROM | disk | FTP | other *** search
Wrap
gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG)))) OOOOppppeeeennnnGGGGLLLL RRRReeeeffffeeeerrrreeeennnncccceeee gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG)))) NNNNAAAAMMMMEEEE gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk - define a callback for a tessellation object CCCC SSSSPPPPEEEECCCCIIIIFFFFIIIICCCCAAAATTTTIIIIOOOONNNN void gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk( GLUtesselator* _t_e_s_s, GLenum _w_h_i_c_h, GLvoid (*_C_a_l_l_B_a_c_k_F_u_n_c)( ) PPPPAAAARRRRAAAAMMMMEEEETTTTEEEERRRRSSSS _t_e_s_s Specifies the tessellation object (created with gggglllluuuuNNNNeeeewwwwTTTTeeeessssssss). _w_h_i_c_h Specifies the callback being defined. The following values are valid: GGGGLLLLUUUU____TTTTEEEESSSSSSSS____BBBBEEEEGGGGIIIINNNN, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____BBBBEEEEGGGGIIIINNNN____DDDDAAAATTTTAAAA, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEEDDDDGGGGEEEE____FFFFLLLLAAAAGGGG, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEEDDDDGGGGEEEE____FFFFLLLLAAAAGGGG____DDDDAAAATTTTAAAA, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____VVVVEEEERRRRTTTTEEEEXXXX, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____VVVVEEEERRRRTTTTEEEEXXXX____DDDDAAAATTTTAAAA, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEENNNNDDDD, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEENNNNDDDD____DDDDAAAATTTTAAAA, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE____DDDDAAAATTTTAAAA, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEERRRRRRRROOOORRRR, and GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEERRRRRRRROOOORRRR____DDDDAAAATTTTAAAA. _C_a_l_l_B_a_c_k_F_u_n_c Specifies the function to be called. DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk is used to indicate a callback to be used by a tessellation object. If the specified callback is already defined, then it is replaced. If _C_a_l_l_B_a_c_k_F_u_n_c is NULL, then the existing callback becomes undefined. These callbacks are used by the tessellation object to describe how a polygon specified by the user is broken into triangles. Note that there are two versions of each callback: one with user-specified polygon data and one without. If both versions of a particular callback are specified, then the callback with user-specified polygon data will be used. Note that the _p_o_l_y_g_o_n__d_a_t_a parameter used by some of the functions is a copy of the pointer that was specified when gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnPPPPoooollllyyyyggggoooonnnn was called. The legal callbacks are as follows: GGGGLLLLUUUU____TTTTEEEESSSSSSSS____BBBBEEEEGGGGIIIINNNN The begin callback is invoked like ggggllllBBBBeeeeggggiiiinnnn to indicate the start of a (triangle) primitive. The function takes a single argument of type GLenum. If the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____BBBBOOOOUUUUNNNNDDDDAAAARRRRYYYY____OOOONNNNLLLLYYYY property is set to GGGGLLLL____FFFFAAAALLLLSSSSEEEE, then the argument is set to either GGGGLLLL____TTTTRRRRIIIIAAAANNNNGGGGLLLLEEEE____FFFFAAAANNNN, GGGGLLLL____TTTTRRRRIIIIAAAANNNNGGGGLLLLEEEE____SSSSTTTTRRRRIIIIPPPP, or GGGGLLLL____TTTTRRRRIIIIAAAANNNNGGGGLLLLEEEESSSS. If the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____BBBBOOOOUUUUNNNNDDDDAAAARRRRYYYY____OOOONNNNLLLLYYYY property is set to GGGGLLLL____TTTTRRRRUUUUEEEE, then the argument will be set to GGGGLLLL____LLLLIIIINNNNEEEE____LLLLOOOOOOOOPPPP. The function prototype for this callback is: void begin ( GLenum type ); PPPPaaaaggggeeee 1111 gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG)))) OOOOppppeeeennnnGGGGLLLL RRRReeeeffffeeeerrrreeeennnncccceeee gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG)))) GGGGLLLLUUUU____TTTTEEEESSSSSSSS____BBBBEEEEGGGGIIIINNNN____DDDDAAAATTTTAAAA The same as the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____BBBBEEEEGGGGIIIINNNN callback except that it takes an additional pointer argument. This pointer is identical to the opaque pointer provided when gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnPPPPoooollllyyyyggggoooonnnn was called. The function prototype for this callback is: void beginData ( GLenum type, void *polygon_data ); GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEEDDDDGGGGEEEE____FFFFLLLLAAAAGGGG The edge flag callback is similar to ggggllllEEEEddddggggeeeeFFFFllllaaaagggg. The function takes a single boolean flag that indicates which edges lie on the polygon boundary. If the flag is GGGGLLLL____TTTTRRRRUUUUEEEE, then each vertex that follows begins an edge that lies on the polygon boundary, that is, an edge that separates an interior region from an exterior one. If the flag is GGGGLLLL____FFFFAAAALLLLSSSSEEEE, then each vertex that follows begins an edge that lies in the polygon interior. The edge flag callback (if defined) is invoked before the first vertex callback. Since triangle fans and triangle strips do not support edge flags, the begin callback is not called with GGGGLLLL____TTTTRRRRIIIIAAAANNNNGGGGLLLLEEEE____FFFFAAAANNNN or GGGGLLLL____TTTTRRRRIIIIAAAANNNNGGGGLLLLEEEE____SSSSTTTTRRRRIIIIPPPP if a non-NULL edge flag callback is provided. (If the callback is initialized to NULL, there is no impact on performance). Instead, the fans and strips are converted to independent triangles. The function prototype for this callback is: void edgeFlag ( GLboolean flag ); GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEEDDDDGGGGEEEE____FFFFLLLLAAAAGGGG____DDDDAAAATTTTAAAA The same as the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEEDDDDGGGGEEEE____FFFFLLLLAAAAGGGG callback except that it takes an additional pointer argument. This pointer is identical to the opaque pointer provided when gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnPPPPoooollllyyyyggggoooonnnn was called. The function prototype for this callback is: void edgeFlagData ( GLboolean flag, void *polygon_data ); GGGGLLLLUUUU____TTTTEEEESSSSSSSS____VVVVEEEERRRRTTTTEEEEXXXX The vertex callback is invoked between the begin and end callbacks. It is similar to ggggllllVVVVeeeerrrrtttteeeexxxx, and it defines the vertices of the triangles created by the tessellation process. The function takes a pointer as its only argument. This pointer is identical to the opaque pointer provided by the user when the vertex was described (see gggglllluuuuTTTTeeeessssssssVVVVeeeerrrrtttteeeexxxx). The function prototype for this callback is: void vertex ( void *vertex_data ); PPPPaaaaggggeeee 2222 gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG)))) OOOOppppeeeennnnGGGGLLLL RRRReeeeffffeeeerrrreeeennnncccceeee gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG)))) GGGGLLLLUUUU____TTTTEEEESSSSSSSS____VVVVEEEERRRRTTTTEEEEXXXX____DDDDAAAATTTTAAAA The same as the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____VVVVEEEERRRRTTTTEEEEXXXX callback except that it takes an additional pointer argument. This pointer is identical to the opaque pointer provided when gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnPPPPoooollllyyyyggggoooonnnn was called. The function prototype for this callback is: void vertexData ( void *vertex_data, void *polygon_data ); GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEENNNNDDDD The end callback serves the same purpose as ggggllllEEEEnnnndddd. It indicates the end of a primitive and it takes no arguments. The function prototype for this callback is: void end ( void ); GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEENNNNDDDD____DDDDAAAATTTTAAAA The same as the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEENNNNDDDD callback except that it takes an additional pointer argument. This pointer is identical to the opaque pointer provided when gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnPPPPoooollllyyyyggggoooonnnn was called. The function prototype for this callback is: void endData ( void *polygon_data); GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE The combine callback is called to create a new vertex when the tessellation detects an intersection, or wishes to merge features. The function takes four arguments: an array of three elements each of type GLdouble, an array of four pointers, an array of four elements each of type GLfloat, and a pointer to a pointer. The prototype is: void combine( GLdouble coords[3], void *vertex_data[4], GLfloat weight[4], void **outData ); The vertex is defined as a linear combination of up to four existing vertices, stored in _v_e_r_t_e_x__d_a_t_a. The coefficients of the linear combination are given by _w_e_i_g_h_t; these weights always add up to 1. All vertex pointers are valid even when some of the weights are 0. _c_o_o_r_d_s gives the location of the new vertex. The user must allocate another vertex, interpolate parameters using _v_e_r_t_e_x__d_a_t_a and _w_e_i_g_h_t, and return the new vertex pointer in _o_u_t_D_a_t_a. This handle is supplied during rendering callbacks. The user is responsible for freeing the memory some time after gggglllluuuuTTTTeeeessssssssEEEEnnnnddddPPPPoooollllyyyyggggoooonnnn is called. PPPPaaaaggggeeee 3333 gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG)))) OOOOppppeeeennnnGGGGLLLL RRRReeeeffffeeeerrrreeeennnncccceeee gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG)))) For example, if the polygon lies in an arbitrary plane in 3- space, and a color is associated with each vertex, the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE callback might look like this: void myCombine( GLdouble coords[3], VERTEX *d[4], GLfloat w[4], VERTEX **dataOut ) { VERTEX *new = new_vertex(); new->x = coords[0]; new->y = coords[1]; new->z = coords[2]; new->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + w[3]*d[3]->r; new->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + w[3]*d[3]->g; new->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + w[3]*d[3]->b; new->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + w[3]*d[3]->a; *dataOut = new; } If the tessellation detects an intersection, then the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE or GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE____DDDDAAAATTTTAAAA callback (see below) must be defined, and it must write a non-NULL pointer into _d_a_t_a_O_u_t. Otherwise the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____NNNNEEEEEEEEDDDD____CCCCOOOOMMMMBBBBIIIINNNNEEEE____CCCCAAAALLLLLLLLBBBBAAAACCCCKKKK error occurs, and no output is generated. GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE____DDDDAAAATTTTAAAA The same as the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE callback except that it takes an additional pointer argument. This pointer is identical to the opaque pointer provided when gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnPPPPoooollllyyyyggggoooonnnn was called. The function prototype for this callback is: void combineData ( GLdouble coords[3], void *vertex_data[4], GLfloat weight[4], void **outData, void *polygon_data ); GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEERRRRRRRROOOORRRR The error callback is called when an error is encountered. The one argument is of type GLenum; it indicates the specific error that occurred and will be set to one of GGGGLLLLUUUU____TTTTEEEESSSSSSSS____MMMMIIIISSSSSSSSIIIINNNNGGGG____BBBBEEEEGGGGIIIINNNN____PPPPOOOOLLLLYYYYGGGGOOOONNNN, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____MMMMIIIISSSSSSSSIIIINNNNGGGG____EEEENNNNDDDD____PPPPOOOOLLLLYYYYGGGGOOOONNNN, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____MMMMIIIISSSSSSSSIIIINNNNGGGG____BBBBEEEEGGGGIIIINNNN____CCCCOOOONNNNTTTTOOOOUUUURRRR, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____MMMMIIIISSSSSSSSIIIINNNNGGGG____EEEENNNNDDDD____CCCCOOOONNNNTTTTOOOOUUUURRRR, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOOOOORRRRDDDD____TTTTOOOOOOOO____LLLLAAAARRRRGGGGEEEE, GGGGLLLLUUUU____TTTTEEEESSSSSSSS____NNNNEEEEEEEEDDDD____CCCCOOOOMMMMBBBBIIIINNNNEEEE____CCCCAAAALLLLLLLLBBBBAAAACCCCKKKK or GGGGLLLLUUUU____OOOOUUUUTTTT____OOOOFFFF____MMMMEEEEMMMMOOOORRRRYYYY. Character strings describing these errors can be retrieved with the gggglllluuuuEEEErrrrrrrroooorrrrSSSSttttrrrriiiinnnngggg call. The function prototype for this callback is: void error ( GLenum errno ); PPPPaaaaggggeeee 4444 gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG)))) OOOOppppeeeennnnGGGGLLLL RRRReeeeffffeeeerrrreeeennnncccceeee gggglllluuuuTTTTeeeessssssssCCCCaaaallllllllbbbbaaaacccckkkk((((3333GGGG)))) The GLU library will recover from the first four errors by inserting the missing call(s). GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOOOOORRRRDDDD____TTTTOOOOOOOO____LLLLAAAARRRRGGGGEEEE indicates that some vertex coordinate exceeded the predefined constant GGGGLLLLUUUU____TTTTEEEESSSSSSSS____MMMMAAAAXXXX____CCCCOOOOOOOORRRRDDDD in absolute value, and that the value has been clamped. (Coordinate values must be small enough so that two can be multiplied together without overflow.) GGGGLLLLUUUU____TTTTEEEESSSSSSSS____NNNNEEEEEEEEDDDD____CCCCOOOOMMMMBBBBIIIINNNNEEEE____CCCCAAAALLLLLLLLBBBBAAAACCCCKKKK indicates that the tessellation detected an intersection between two edges in the input data, and the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE or GGGGLLLLUUUU____TTTTEEEESSSSSSSS____CCCCOOOOMMMMBBBBIIIINNNNEEEE____DDDDAAAATTTTAAAA callback was not provided. No output is generated. GGGGLLLLUUUU____OOOOUUUUTTTT____OOOOFFFF____MMMMEEEEMMMMOOOORRRRYYYY indicates that there is not enough memory so no output is generated. GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEERRRRRRRROOOORRRR____DDDDAAAATTTTAAAA The same as the GGGGLLLLUUUU____TTTTEEEESSSSSSSS____EEEERRRRRRRROOOORRRR callback except that it takes an additional pointer argument. This pointer is identical to the opaque pointer provided when gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnPPPPoooollllyyyyggggoooonnnn was called. The function prototype for this callback is: void errorData ( GLenum errno, void *polygon_data ); EEEEXXXXAAAAMMMMPPPPLLLLEEEE Polygons tessellated can be rendered directly like this: gluTessCallback(tobj, GLU_TESS_BEGIN, glBegin); gluTessCallback(tobj, GLU_TESS_VERTEX, glVertex3dv); gluTessCallback(tobj, GLU_TESS_END, glEnd); gluTessCallback(tobj, GLU_TESS_COMBINE, myCombine); gluTessBeginPolygon(tobj, NULL); gluTessBeginContour(tobj); gluTessVertex(tobj, v, v); ... gluTessEndContour(tobj); gluTessEndPolygon(tobj); Typically, the tessellated polygon should be stored in a display list so that it does not need to be retessellated every time it is rendered. SSSSEEEEEEEE AAAALLLLSSSSOOOO ggggllllBBBBeeeeggggiiiinnnn, ggggllllEEEEddddggggeeeeFFFFllllaaaagggg, ggggllllVVVVeeeerrrrtttteeeexxxx, gggglllluuuuNNNNeeeewwwwTTTTeeeessssssss, gggglllluuuuEEEErrrrrrrroooorrrrSSSSttttrrrriiiinnnngggg, gggglllluuuuTTTTeeeessssssssVVVVeeeerrrrtttteeeexxxx, gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnPPPPoooollllyyyyggggoooonnnn, gggglllluuuuTTTTeeeessssssssBBBBeeeeggggiiiinnnnCCCCoooonnnnttttoooouuuurrrr, gggglllluuuuTTTTeeeessssssssPPPPrrrrooooppppeeeerrrrttttyyyy, gggglllluuuuTTTTeeeessssssssNNNNoooorrrrmmmmaaaallll PPPPaaaaggggeeee 5555